import inquirer from "inquirer";
import { readFile } from "fs/promises";
import shell from "shelljs";
import os from "os";
import _ from "lodash"; // ES6
import ejs from "ejs";
import fs from "fs";
import path from "path";
import JimmerModel from "../files/jimmer-model.js";
const user = os.userInfo();
const deviceName = os.hostname();
const pkg = JSON.parse(
  await readFile(new URL("../../package.json", import.meta.url))
);

function formatDate(dateString) {
  if (!dateString) return "";
  const date = new Date(dateString);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, "0");
  const day = String(date.getDate()).padStart(2, "0");
  const hours = String(date.getHours()).padStart(2, "0");
  const minutes = String(date.getMinutes()).padStart(2, "0");
  const seconds = String(date.getSeconds()).padStart(2, "0");
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

export default function (config) {
  const data = {
    info: {
      author: `${deviceName}@${user.username} 使用 ${pkg.name}@${pkg.version} 创建`,
      since: formatDate(new Date()),
    },
  };
  inquirer
    .prompt([
      {
        type: "list",
        name: "type",
        message: "请选择当前项目的类型:",
        choices: config.types,
        default: "backend",
      },
      {
        type: "input",
        name: "jsonPath",
        message: "请输入模型josn配置路径",
        default: "./model.json",
      },
      {
        type: "input",
        name: "savePath",
        message: "请输入保存目录",
        default: "./",
      },
    ])
    .then((answers) => {
      if (!fs.existsSync(answers.savePath)) {
        fs.mkdirSync(answers.savePath);
      }
      readFile(answers.jsonPath)
        .then((result) => {
          shell.cd(`${answers.savePath}`);
          const file = JSON.parse(result);

          data.model = file.model;

          // data._ = _;
          // const convertDbTypeToJavaType = (column) => {
          //   const dbType = column.type;
          //   // 提取基础类型（忽略长度等参数）
          //   const baseType = dbType.split("(")[0].toUpperCase();
          //   const mappings = config.mappings.java || {
          //     INT: "Integer",
          //     BIGINT: "String",
          //     VARCHAR: "String",
          //     TEXT: "String",
          //     DATETIME: "LocalDateTime",
          //     DATE: "LocalDate",
          //     TIME: "LocalTime",
          //     DECIMAL: "BigDecimal",
          //     FLOAT: "Float",
          //     DOUBLE: "Double",
          //     BOOLEAN: "Boolean",
          //     BLOB: "byte[]",
          //     ENUM: "String",
          //   };
          //   return mappings[baseType] || "Object"; // 默认返回 Object 处理未知类型
          // };
          // data.convertDbTypeToJavaType = convertDbTypeToJavaType;
          // const convertDbTypeToTypeScriptType = (dbType) => {
          //   // 提取基础类型（忽略长度等参数）
          //   const baseType = dbType.split("(")[0].toUpperCase();
          //   const mappings = config.mappings.typescript || {
          //     INT: "number",
          //     BIGINT: "string",
          //     VARCHAR: "string",
          //     TEXT: "string",
          //     DATETIME: "date",
          //     DATE: "date",
          //     TIME: "date",
          //     DECIMAL: "number",
          //     FLOAT: "number",
          //     DOUBLE: "number",
          //     BOOLEAN: "boolean",
          //     BLOB: "byte[]",
          //     ENUM: "string",
          //   };
          //   return mappings[baseType] || "Object"; // 默认返回 Object 处理未知类型
          // };
          // data.convertDbTypeToTypeScriptType = convertDbTypeToTypeScriptType;

          // const getPrimaryKeyJavaType = (columns) => {
          //   const pri = columns.find((it) => it.isPrimaryKey);
          //   const baseType = pri.type.split("(")[0].toUpperCase();
          //   const mappings = config.mappings.java || {
          //     INT: "Integer",
          //     BIGINT: "String",
          //     VARCHAR: "String",
          //     TEXT: "String",
          //     DATETIME: "LocalDateTime",
          //     DATE: "LocalDate",
          //     TIME: "LocalTime",
          //     DECIMAL: "BigDecimal",
          //     FLOAT: "Float",
          //     DOUBLE: "Double",
          //     BOOLEAN: "Boolean",
          //     BLOB: "byte[]",
          //     ENUM: "String",
          //   };
          //   return mappings[baseType] || "Object";
          // };
          // const getStringMaxLength = (column) => {
          //   const dbType = column.type;
          //   if (dbType.indexOf("(")) {
          //     return dbType.substring(
          //       dbType.indexOf("(") + 1,
          //       dbType.indexOf(")")
          //     );
          //   }
          //   return undefined;
          // };
          // data.getPrimaryKeyJavaType = getPrimaryKeyJavaType;
          // data.getStringMaxLength = getStringMaxLength;
          config.templates
            .filter((it) => it.type == answers.type)
            .forEach((item) => {
              JimmerModel(config, data, item);
            });
        })
        .catch((err) => {
          console.error(err);
        });
    });
}
